﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrustX.Dados;
using AcadPos.Entity;
using System.Data;
using System.Data.SqlClient;

namespace AcadPos.Data
{
    public class DBMatrizCurricular
    {
        #region Inserir
        public bool inserir(MatrizCurricular matriz, string usuario)
        {
            string SQL = @"exec SP_INSERE_MATRIZ_CURRICULAR
                                    @ID_MODULO_CURRICULO,
                                    @ID_DISCIPLINA,
                                    @ORDEM_MINISTRACAO,
                                    @CH_DISCIPLINA,
                                    @EMENTA_PROJETO,
                                    @EMENTA_EXECUCAO,
                                    @REFERENCIA_BIBLIOGRAFICA";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
            db.AddParam("@ID_DISCIPLINA", SqlDbType.Int, matriz.IdDisciplina);
            db.AddParam("@ORDEM_MINISTRACAO", SqlDbType.Int, matriz.OrdemMinistracao);
            db.AddParam("@CH_DISCIPLINA", SqlDbType.Int, matriz.CargaHorarioDisc);
            db.AddParam("@EMENTA_PROJETO", SqlDbType.Text, matriz.EmentaProjeto);
            db.AddParam("@EMENTA_EXECUCAO", SqlDbType.Text, matriz.EmentaExecucao);
            db.AddParam("@REFERENCIA_BIBLIOGRAFICA", SqlDbType.Text, matriz.ReferenciaBibliografica);

            //return db.ExecuteNonQuery();

            bool inseriu = db.ExecuteNonQuery();

            if (inseriu)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                      (
                        ACAO,
                        TABELA,
                        DESCRICAO,
                        USUARIO,
                        DATA                                    
                      )
                    VALUES
                      (                                     
                        'INSERT',
                        'TB_MATRIZ_CURRICULAR',
                        ((SELECT CAST(MAX(ID_MATRIZ_CURRICULAR) AS VARCHAR) FROM TB_MATRIZ_CURRICULAR)
                        + ' | ' + CAST(@ID_MODULO_CURRICULO AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ORDEM_MINISTRACAO AS VARCHAR) 
                        + ' | ' + CAST(@CH_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR)),
                        UPPER(@USUARIO),
                        GETDATE()
                      )";
                db = new DataAccess(SQL);

                db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
                db.AddParam("@ID_DISCIPLINA", SqlDbType.Int, matriz.IdDisciplina);
                db.AddParam("@ORDEM_MINISTRACAO", SqlDbType.Int, matriz.OrdemMinistracao);
                db.AddParam("@CH_DISCIPLINA", SqlDbType.Int, matriz.CargaHorarioDisc);
                db.AddParam("@EMENTA_PROJETO", SqlDbType.Text, matriz.EmentaProjeto);
                db.AddParam("@EMENTA_EXECUCAO", SqlDbType.Text, matriz.EmentaExecucao);
                db.AddParam("@REFERENCIA_BIBLIOGRAFICA", SqlDbType.Text, matriz.ReferenciaBibliografica);
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }
            db.ExecuteNonQuery();
            return inseriu;
        }
        #endregion

        #region Alterar
        public bool alterar(MatrizCurricular matriz, string usuario)
        {
            string SQL = @"exec SP_ALTERA_MATRIZ_CURRICULAR 
                                    @ID_MATRIZ_CURRICULAR,
                                    @ID_MODULO_CURRICULO,
                                    @ID_DISCIPLINA,
                                    @ORDEM_MINISTRACAO,
                                    @CH_DISCIPLINA,
                                    @EMENTA_PROJETO,
                                    @EMENTA_EXECUCAO,
                                    @REFERENCIA_BIBLIOGRAFICA";

            DataAccess db = new DataAccess(SQL);
            
            db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
            db.AddParam("@ID_DISCIPLINA", SqlDbType.Int, matriz.IdDisciplina);
            db.AddParam("@ORDEM_MINISTRACAO", SqlDbType.Int, matriz.OrdemMinistracao);
            db.AddParam("@CH_DISCIPLINA", SqlDbType.Int, matriz.CargaHorarioDisc);
            db.AddParam("@EMENTA_PROJETO", SqlDbType.Text, matriz.EmentaProjeto);
            db.AddParam("@EMENTA_EXECUCAO", SqlDbType.Text, matriz.EmentaExecucao);
            db.AddParam("@REFERENCIA_BIBLIOGRAFICA", SqlDbType.Text, matriz.ReferenciaBibliografica);
            db.AddParam("@ID_MATRIZ_CURRICULAR", SqlDbType.Int, matriz.IdMatrizCurricular);

            //return db.ExecuteNonQuery();

            bool atualizou = db.ExecuteNonQuery();

            if (atualizou)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                      (
                        ACAO,
                        TABELA,
                        DESCRICAO,
                        USUARIO,
                        DATA                                    
                      )
                    VALUES
                      (                                     
                        'UPDATE',
                        'TB_MATRIZ_CURRICULAR',
                        (SELECT CAST(@ID_MATRIZ_CURRICULAR AS VARCHAR)
                        + ' | ' + CAST(@ID_MODULO_CURRICULO AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ORDEM_MINISTRACAO AS VARCHAR) 
                        + ' | ' + CAST(@CH_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR)),
                        UPPER(@USUARIO),
                        GETDATE()
                      )";
                
                db = new DataAccess(SQL);

                db.AddParam("@ID_MATRIZ_CURRICULAR", SqlDbType.Int, matriz.IdMatrizCurricular);
                db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
                db.AddParam("@ID_DISCIPLINA", SqlDbType.Int, matriz.IdDisciplina);
                db.AddParam("@ORDEM_MINISTRACAO", SqlDbType.Int, matriz.OrdemMinistracao);
                db.AddParam("@CH_DISCIPLINA", SqlDbType.Int, matriz.CargaHorarioDisc);
                db.AddParam("@EMENTA_PROJETO", SqlDbType.Text, matriz.EmentaProjeto);
                db.AddParam("@EMENTA_EXECUCAO", SqlDbType.Text, matriz.EmentaExecucao);
                db.AddParam("@REFERENCIA_BIBLIOGRAFICA", SqlDbType.Text, matriz.ReferenciaBibliografica); 
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }

            db.ExecuteNonQuery();
            return atualizou;
        }
        #endregion

        #region Excluir
        public bool excluir(MatrizCurricular matriz,string usuario)
        {
            string SQL = @"exec SP_EXCLUI_MATRIZ_CURRICULAR
                                     @ID_MATRIZ_CURRICULAR";

            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_MATRIZ_CURRICULAR", SqlDbType.Int, matriz.IdMatrizCurricular);

            //return db.ExecuteNonQuery();

            bool excluiu = db.ExecuteNonQuery();

            if (excluiu)
            {
                SQL = @"INSERT INTO TB_AUDITORIA
                      (
                        ACAO,
                        TABELA,
                        DESCRICAO,
                        USUARIO,
                        DATA                                    
                      )
                    VALUES
                      (                                     
                        'DELETE',
                        'TB_MODULO_CURRICULO',
                        (SELECT CAST(@ID_MATRIZ_CURRICULAR AS VARCHAR)
                        + ' | ' + CAST(@ID_MODULO_CURRICULO AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ORDEM_MINISTRACAO AS VARCHAR) 
                        + ' | ' + CAST(@CH_DISCIPLINA AS VARCHAR) 
                        + ' | ' + CAST(@ID_DISCIPLINA AS VARCHAR)),
                        UPPER(@USUARIO),
                        GETDATE()
                      )";
                db = new DataAccess(SQL);

                db.AddParam("@ID_MATRIZ_CURRICULAR", SqlDbType.Int, matriz.IdMatrizCurricular);
                db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
                db.AddParam("@ID_DISCIPLINA", SqlDbType.Int, matriz.IdDisciplina);
                db.AddParam("@ORDEM_MINISTRACAO", SqlDbType.Int, matriz.OrdemMinistracao);
                db.AddParam("@CH_DISCIPLINA", SqlDbType.Int, matriz.CargaHorarioDisc);
                db.AddParam("@EMENTA_PROJETO", SqlDbType.Text, matriz.EmentaProjeto);
                db.AddParam("@EMENTA_EXECUCAO", SqlDbType.Text, matriz.EmentaExecucao);
                db.AddParam("@REFERENCIA_BIBLIOGRAFICA", SqlDbType.Text, matriz.ReferenciaBibliografica);
                db.AddParam("@USUARIO", SqlDbType.VarChar, usuario);
            }
            db.ExecuteNonQuery();
            return excluiu;
        }
        #endregion

        #region Listar Disciplinas por Módulo Currículo
        public DataTable listarDisciplinasModuloCurriculo(MatrizCurricular matriz)
        {
            string SQL = @"SELECT  tmc.ID_MATRIZ_CURRICULAR,
                                   tmc.ID_MODULO_CURRICULO,
                                   tmc.ID_DISCIPLINA,
                                   tmc.ORDEM_MINISTRACAO,
                                   tmc.CH_DISCIPLINA,
                                   tmc.EMENTA_PROJETO,
                                   tmc.EMENTA_EXECUCAO,
                                   tmc.REFERENCIA_BIBLIOGRAFICA,
                                   td.DESCRICAO AS DESCRICAO_DISCIPLINA
                            FROM   TB_MATRIZ_CURRICULAR tmc
                                   INNER JOIN TB_DISCIPLINA td
                                        ON  td.ID_DISCIPLINA = tmc.ID_DISCIPLINA
                            WHERE  tmc.ID_MODULO_CURRICULO = @ID_MODULO_CURRICULO
                            ORDER BY ORDEM_MINISTRACAO";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_MODULO_CURRICULO", SqlDbType.Int, matriz.IdModuloCurriculo);
            return db.GetDataTable();
        }
        #endregion

        #region Listar Disciplinas por Módulo Currículo
        public MatrizCurricular listarDisciplinasModuloCurriculoObj(MatrizCurricular matriz)
        {
            string SQL = @"SELECT  tmc.ID_MATRIZ_CURRICULAR,
                                   tmc.ID_MODULO_CURRICULO,
                                   tmc.ID_DISCIPLINA,
                                   tmc.ORDEM_MINISTRACAO,
                                   tmc.CH_DISCIPLINA,
                                   tmc.EMENTA_PROJETO,
                                   tmc.EMENTA_EXECUCAO,
                                   tmc.REFERENCIA_BIBLIOGRAFICA,
                                   td.DESCRICAO AS DESCRICAO_DISCIPLINA                                   
                            FROM   TB_MATRIZ_CURRICULAR tmc
                                   INNER JOIN TB_DISCIPLINA td
                                        ON  td.ID_DISCIPLINA = tmc.ID_DISCIPLINA
                            WHERE  tmc.ID_MATRIZ_CURRICULAR = @ID_MATRIZ_CURRICULAR
                            ORDER BY tmc.ORDEM_MINISTRACAO";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@ID_MATRIZ_CURRICULAR", SqlDbType.Int, matriz.IdMatrizCurricular);
            try
            {
                db.AbrirConexao();
                SqlDataReader dr = db.ExecuteReader();
                if (dr.Read())
                {
                    matriz.IdMatrizCurricular = Convert.ToInt32(dr["ID_MATRIZ_CURRICULAR"].ToString());
                    matriz.IdDisciplina = Convert.ToInt32(dr["ID_DISCIPLINA"].ToString());
                    matriz.IdModuloCurriculo = Convert.ToInt32(dr["ID_MODULO_CURRICULO"].ToString());
                    matriz.OrdemMinistracao = Convert.ToInt32(dr["ORDEM_MINISTRACAO"].ToString());
                    matriz.CargaHorarioDisc = Convert.ToInt32(dr["CH_DISCIPLINA"].ToString());
                    matriz.EmentaProjeto = dr["EMENTA_PROJETO"].ToString();
                    matriz.EmentaExecucao = dr["EMENTA_EXECUCAO"].ToString();
                    matriz.ReferenciaBibliografica = dr["REFERENCIA_BIBLIOGRAFICA"].ToString();
                    matriz.DescricaoDisciplina = dr["DESCRICAO_DISCIPLINA"].ToString();

                }
                return matriz;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                db.FecharConexao();
            }
        }
        #endregion

        #region Relatório de Matriz Curricular
        public DataTable getRelMatrizCurricular(int pCurso, int pCurriculo, int pAreaConhecimento)
        {
            string SQL = @"SELECT tmc.ORDEM_MINISTRACAO AS ORDEM,
                                   td.DESCRICAO AS DISCIPLINA,
                                   tmc.CH_DISCIPLINA AS CH,
                                   tm.DESCRICAO AS MODULO,
                                   tmc.EMENTA_PROJETO,
                                   tmc.EMENTA_EXECUCAO,
                                   tmc.REFERENCIA_BIBLIOGRAFICA
                            FROM   TB_MATRIZ_CURRICULAR tmc
                                   JOIN TB_DISCIPLINA td
                                        ON  td.ID_DISCIPLINA = tmc.ID_DISCIPLINA
                                   JOIN TB_MODULO_CURRICULO tmc2
                                        ON  tmc2.ID_MODULO_CURRICULO = tmc.ID_MODULO_CURRICULO
                                   JOIN TB_CURRICULO tc
                                        ON  tc.ID_CURRICULO = tmc2.ID_CURRICULO
                                   JOIN TB_CURSO tc2
                                        ON  tc2.ID_CURSO = tc.ID_CURSO
                                   JOIN TB_MODULO tm
                                        ON  tm.ID_MODULO = tmc2.ID_MODULO
                            WHERE  tc.ID_CURSO = @CURSO
                                   AND tc.ID_CURRICULO = @CURRICULO
                                   AND tc2.ID_AREA_CONHECIMENTO = @AREA_CONHECIMENTO
                            ORDER BY tmc.ORDEM_MINISTRACAO";
            DataAccess db = new DataAccess(SQL);
            db.AddParam("@CURSO", SqlDbType.Int, pCurso);
            db.AddParam("@CURRICULO", SqlDbType.Int, pCurriculo);
            db.AddParam("@AREA_CONHECIMENTO", SqlDbType.Int, pAreaConhecimento);
            return db.GetDataTable();
        }
        #endregion
    }
}
